#ifndef  __USB_MONITOR_
#define  __USB_MONITOR_
#include <libudev.h>
#include "util-cjson.h"
#include "common.h"
#include "debug.h"

#define UNKNOWN_INFO   "N/A"
#define PATH_MAX       1024
#define MAX_PARTITIONS 8        // 支持最大8个分区
#define SETTLE_DELAY   500000   // 500ms延迟等待设备属性填充就绪
#define RETRY_COUNT    3        //重新尝试次数

#define FILENAME_USB_INTERFACE "/opt/app/ics-agent/sync/engineSync/interface_auth.json"
#define USB_MONITOR_PID "/var/run/usb_monitor.pid"
#define USB_MONITOR_LOG "/var/log/usb_hotplug_monitor.log"

#define true    1
#define false   0

typedef enum {
    DEV_STORAGE,
    DEV_KEYBOARD,
    DEV_MOUSE,
    DEV_NETWORK,
    DEV_PHONE,
    DEV_UNKNOWN
} DeviceType;

// 分区详细信息结构
typedef struct {
    char node[64];          // 设备节点（如/dev/sdb1）
    char uuid[64];          // 分区UUID
    char fs_type[32];       // 文件系统类型
    char label[64];         // 卷标
    uint64_t size;          // 分区大小（字节）
} PartitionInfo;

// 存储设备聚合信息结构
typedef struct {
    //公共信息
    char engine_id[32];         //引擎id
    char engine_name[64];       //引擎name
    int  interface_type;        //接口类型: 网络接口0, 串口接口1, kvm接口2, usb接口3（1手机、2无线网卡、3键盘、4鼠标、5U盘）
    char interface_name[64];    //接口名称: usb111
    char usb_keyword[64];       // 外设唯一标识：序列号
    char usb_mount_dir[64];     // 设备外设挂载点 "/mnt/root"
    int  action;                // 动作：接入0， 拔出1

    //desc 属性信息
    //设备特殊描述信息，到时候加入到desc描述信息
    char dev_type[32];          // 设备类型
    char vendor[64];            // 厂商
    char vendor_id[64];         // 厂商 ID
    char model[64];             // 制造商
    char model_id[64];          // 制造商 ID
    char sys_path[PATH_MAX];    // 系统路径
    //存储设备专用
    uint64_t total_size;        // 总容量
    unsigned partition_count;   // 分区数量
    PartitionInfo partitions[MAX_PARTITIONS]; // 分区详细信息
} StorageInfo;

int  getBasicCommonDeviceInfo(struct udev_device *dev, StorageInfo *info);
void get_partition_metadata(struct udev_device *part_dev, PartitionInfo *p);
void get_partitions_info(struct udev *udev, struct udev_device *parent, StorageInfo *info);
void format_capacity(uint64_t bytes, char *buf, size_t buf_size);
void usb_event_log_json_send(StorageInfo *info);
void parse_physical_port(struct udev_device *dev, char *buffer, size_t size);
int  getBasicCommonDeviceInfo(struct udev_device *dev, StorageInfo *info);

#endif
